﻿using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Comissoes.JQGridObject;
using Comissoes.Models;
using System.Data.Linq.Mapping;
using System.Data.Linq;

namespace Comissoes.Controllers
{
    public class DefaultController : AppController
    {
        xcontEntities db = new xcontEntities();
        
        // Detalhes para filtros
        public JsonResult Details(int value, String type)
        {
            String text = String.Empty;

            switch (type)
            {
                case "PESSOAS":
                    if (db.PESSOAS.Any(t => t.ID_PESSOA == value))
                        text = db.PESSOAS.FirstOrDefault(t => t.ID_PESSOA == value).NOME_PESSOA;
                    break;                
                case "CLIENTES":
                    if (db.CLIENTES.Any(t => t.COD_CLI == value))
                        text = db.CLIENTES.Include("PESSOAS").FirstOrDefault(t => t.COD_CLI == value).PESSOAS.NOME_PESSOA;
                    break;
                case "FORNECEDORES":
                    if (db.FORNECEDORES.Any(t => t.COD_FORN == value))
                        text = db.FORNECEDORES.Include("PESSOAS").FirstOrDefault(t => t.COD_FORN == value).PESSOAS.NOME_PESSOA;
                    break;
                case "LOJAS":
                    if (db.LOJAS.Any(t => t.COD_LOJA == value))
                        text = db.LOJAS.FirstOrDefault(t => t.COD_LOJA == value).NOME_LOJA;
                    break;
                case "OPERADORES":
                    if (db.OPERADORES.Any(t => t.ID_OPER == value))
                        text = db.OPERADORES.Include("PESSOAS").FirstOrDefault(t => t.ID_OPER == value).PESSOAS.NOME_PESSOA;
                    break;
                case "PRODUTOS":
                    if (db.PRODUTOS.Any(t => t.COD_PROD == value))
                        text = db.PRODUTOS.FirstOrDefault(t => t.COD_PROD == value).DESC_PROD;
                    break;
                case "TRANSPORTADORES":
                    if (db.TRANSPORTADORES.Any(t => t.COD_TRAN == value))
                        text = db.TRANSPORTADORES.Include("PESSOAS").FirstOrDefault(t => t.COD_TRAN == value).PESSOAS.NOME_PESSOA;
                    break;
                default:
                    if (db.VENDEDORES.Any(t => t.COD_VEND == value))
                        text = db.VENDEDORES.Include("PESSOAS").FirstOrDefault(t => t.COD_VEND == value).PESSOAS.NOME_PESSOA;
                    break;
            }

            if (string.IsNullOrEmpty(text))
                return Json(null, JsonRequestBehavior.AllowGet);

            return Json(text, JsonRequestBehavior.AllowGet);
        }

        public JsonResult AutoComplete(String type, String term)
        {
            IQueryable<lookup> q;

            switch (type)
            {
                case "Pessoas": q = from c in db.PESSOAS where c.NOME_PESSOA.ToUpper().Contains(term.ToUpper()) select new lookup() { value = c.NOME_PESSOA, label = c.NOME_PESSOA, ide = c.ID_PESSOA }; break;
                case "Clientes": q = from c in db.CLIENTES where c.PESSOAS.NOME_PESSOA.ToUpper().Contains(term.ToUpper()) select new lookup() { value = c.PESSOAS.NOME_PESSOA, ide = c.COD_CLI, label = c.PESSOAS.NOME_PESSOA }; break;
                case "Fornecedores": q = from c in db.FORNECEDORES where c.PESSOAS.NOME_PESSOA.ToUpper().Contains(term.ToUpper()) select new lookup() { value = c.PESSOAS.NOME_PESSOA, ide = c.COD_FORN, label = c.PESSOAS.NOME_PESSOA }; break;
                case "Lojas": q = from c in db.LOJAS where c.NOME_LOJA.ToUpper().Contains(term.ToUpper()) select new lookup() { ide = c.COD_LOJA, value = c.NOME_LOJA, label = c.NOME_LOJA }; break;
                case "Operadores": q = from c in db.OPERADORES where c.PESSOAS.NOME_PESSOA.ToUpper().Contains(term.ToUpper()) select new lookup() { value = c.PESSOAS.NOME_PESSOA, label = c.PESSOAS.NOME_PESSOA, ide = c.ID_OPER }; break;
                case "Produtos": q = from c in db.PRODUTOS where c.DESC_PROD.ToUpper().Contains(term.ToUpper()) select new lookup() { ide = c.COD_PROD, value = c.DESC_PROD, label = c.DESC_PROD }; break;
                case "Transportadores": q = from c in db.TRANSPORTADORES where c.PESSOAS.NOME_PESSOA.ToUpper().Contains(term.ToUpper()) select new lookup() { value = c.PESSOAS.NOME_PESSOA, label = c.PESSOAS.NOME_PESSOA, ide = c.COD_TRAN }; break;
                case "Vendedores": q = from c in db.VENDEDORES where c.PESSOAS.NOME_PESSOA.ToUpper().Contains(term.ToUpper()) select new lookup() { value = c.PESSOAS.NOME_PESSOA, label = c.PESSOAS.NOME_PESSOA, ide = c.COD_VEND }; break;
                default: q = from c in db.VENDEDORES where c.PESSOAS.NOME_PESSOA.ToUpper().Contains(term.ToUpper()) select new lookup() { value = c.PESSOAS.NOME_PESSOA, label = c.PESSOAS.NOME_PESSOA, ide = c.COD_VEND }; break;
            }
            return Json(q.Take(10), JsonRequestBehavior.AllowGet);
        }

        public ActionResult Lookup()
        {
            return PartialView();
        }

        private class lookup
        {
            public long ide { get; set; }
            public String value { get; set; }
            public String label { get; set; }
        }

        // LookupList
        public JsonResult LookupList(String sidx, String sord, Int32 page, Int32 rows, Boolean _search, String label, String ide, String type, String searchOper, Int32? ID_PESSOA, Char? TipoPessoa, Int32 ID_FNPR)
        {
            IQueryable<lookup> q;
            IEnumerable<lookup> e;

            switch (type)
            {
                case "PESSOAS": q = from c in db.PESSOAS select new lookup() { ide = c.ID_PESSOA, value = c.NOME_PESSOA, label = c.NOME_PESSOA }; break;
                case "CLIENTES": q = from c in db.CLIENTES select new lookup() { ide = c.COD_CLI, value = c.PESSOAS.NOME_PESSOA, label = c.PESSOAS.NOME_PESSOA }; break;
                case "FORNECEDORES": q = from c in db.FORNECEDORES select new lookup() { ide = c.COD_FORN, value = c.PESSOAS.NOME_PESSOA, label = c.PESSOAS.NOME_PESSOA }; break;
                case "LOJAS": q = from c in db.LOJAS select new lookup() { ide = c.COD_LOJA, value = c.NOME_LOJA, label = c.NOME_LOJA }; break;
                case "OPERADORES": q = from c in db.OPERADORES select new lookup() { ide = c.ID_OPER, value = c.PESSOAS.NOME_PESSOA, label = c.PESSOAS.NOME_PESSOA }; break;
                case "PRODUTOS": q = from c in db.PRODUTOS select new lookup() { ide = c.COD_PROD, value = c.DESC_PROD, label = c.DESC_PROD }; break;
                case "TRANSPORTADORES": q = from c in db.TRANSPORTADORES select new lookup() { ide = c.COD_TRAN, value = c.PESSOAS.NOME_PESSOA, label = c.PESSOAS.NOME_PESSOA }; break;
                case "VENDEDORES": q = from c in db.VENDEDORES select new lookup() { ide = c.COD_VEND, value = c.PESSOAS.NOME_PESSOA, label = c.PESSOAS.NOME_PESSOA }; break;
                case "ENDERECOS":
                    PESSOAS pessoa;
                    switch (TipoPessoa)
                    {
                        case 'A':
                            pessoa = db.LOJAS.Include("PESSOAS").FirstOrDefault(t => t.COD_LOJA == ID_PESSOA).PESSOAS;
                            break;
                        case 'B':
                            pessoa = db.CLIENTES.Include("PESSOAS").FirstOrDefault(t => t.COD_CLI == ID_PESSOA).PESSOAS;                            
                            break;
                        default:
                            pessoa = db.TRANSPORTADORES.Include("PESSOAS").FirstOrDefault(t => t.COD_TRAN == ID_PESSOA).PESSOAS;
                            break;
                    }
                    e = from c in db.ENDERECOS_PESSOA.Include("PESSOAS")
                                                     .Include("ENDERECOS")
                                                     .Include("ENDERECOS.LOGRADOUROS")
                                                     .Include("ENDERECOS.BAIRROS")
                                                     .Include("ENDERECOS.BAIRROS.CIDADES")
                                                     .Include("ENDERECOS.BAIRROS.CIDADES.UFS")
                            .ToList()
                        where c.PESSOAS.ID_PESSOA == pessoa.ID_PESSOA
                        select new lookup()
                        {
                            ide = (Int64)ID_PESSOA,
                            value = c.ID_ENPS.ToString(),
                            label = c.ENDERECOS.LOGRADOUROS.NOME_LOGRAD + ". " + c.ENDERECOS.LOGR_END + ", " + c.NUMERO_ENPS + " " + c.COMPL_ENPS + " - " + c.ENDERECOS.BAIRROS.NOME_BAIRRO + " - " + c.ENDERECOS.BAIRROS.CIDADES.NOME_CID + " - " + c.ENDERECOS.BAIRROS.CIDADES.UFS.SIGLA_UF + " " + c.ENDERECOS.CEP_END
                        };
                    q = e.AsQueryable();
                    break;
                default: q = from c in db.VENDEDORES select new lookup() { ide = c.COD_VEND, value = c.PESSOAS.NOME_PESSOA, label = c.PESSOAS.NOME_PESSOA }; break;
            }

            String searchField = string.IsNullOrEmpty(label) ? "ide" : "label";
            String searchString = string.IsNullOrEmpty(label) ? ide : label;

            JQGridBuilder jbuilder = new JQGridBuilder(q, page, sidx, sord, searchField, searchString, searchOper, "ide", _search, rows);

            return Json(jbuilder.GetObject(), JsonRequestBehavior.AllowGet);
        }
    }
}